
/*
  HOJA DE TRABAJO 5
ListCircular.java
Fecha: 2 de Septiembre de 2011
Autor: Claudia Grajeda
Descripcion:


*/

/**
 * @author Claudia Grajeda
 *
 */
import java.util.*;
import java.util.Random;


public class ListCircular<T> extends Abstracta<T>{

	private Queue<T> circular1 = new LinkedList<T>();	     // la cola 1
	private Queue<T> circular2 = new LinkedList<T>();		// cola 2
	private Queue<T> circular3 = new LinkedList<T>();		//cola 3
	private Queue<T> circular4 = new LinkedList<T>();		//cola 4
	private Random num = new Random();
	private T cliente, cliente2;
	int head;
	int count;
	int end;
	
	
	/**
	 *Listcircular: constructor, inicializa las variables
	 */
	public ListCircular(){
		super();		
		head = 0;
		count = 0;
		end = 0;
	}

	@Override
	public T element() {
		
		return null;
	}



	@Override
	public boolean empty() {
		
		return false;
	}
	
	
	
	public String toString(){
		String descripcion;
		descripcion ="\n";
		descripcion+="eventos o lista de clientes y su entrada \n";
		
		//for (int num1 = 0; num1<tamano; num1++){
			//descripcion+= (num1+1) +":";
			//descripcion += data[num1].toString();

		//}
		
		
		descripcion+="ventanilla 1 \n";
		descripcion += circular1.peek();
		descripcion+="\n";
	
		descripcion+="ventanilla 2 \n";
		descripcion += circular2.peek();
		descripcion+="\n";
		
		descripcion+="ventanilla 3 \n";
		descripcion += circular3.peek();
		descripcion+="\n";
		
		descripcion+="ventanilla 4 \n";
		descripcion += circular1.peek();
		descripcion+="\n";
		
		
		return descripcion;
	
	}

	@Override
	public T remove(int p) {
		
		if (circular1.peek() == cliente){
			cliente2 = circular1.remove();
		}
		if (circular2.peek() == cliente){
			cliente2 = circular2.remove();
		}
		if (circular3.peek() == cliente){
			cliente2 = circular3.remove();
		}
		if (circular4.peek() == cliente){
			cliente2 = circular4.remove();
		}
		return cliente2;
	}

	

	public void add(T e) {
		cliente = e;
		int num1 = num.nextInt(481);
		if (circular1.size() <= circular2.size()){
			if (circular1.size() <= circular3.size()){
				if (circular1.size() <= circular4.size()){
					circular1.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
				else{
					circular4.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
			}
			else{
				if (circular3.size() <= circular4.size()){
					circular3.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
				else{
					circular4.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
			}
		}
		else {
			if (circular2.size() <= circular3.size()){
				if (circular2.size() <= circular4.size()){
					circular2.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
				else{
					circular4.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
			}
			else{
				if (circular3.size() <= circular4.size()){
					circular3.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
				else{
					circular4.add(e);
					if (circular1.size() == 1){
						((Cliente) e).setTrans(num1);
						((Cliente) e).setEvento();
					}
				}
			}
		}
	}
	
	
	public void setTransaccion(){
		int num1 = num.nextInt(481);
		if (((Cliente) cliente).getTrans() != 0){
			((Cliente) cliente).setTrans(num1);
			((Cliente) cliente).setEvento();
		}		
	}
	
	public T[] ordenar(T data[], int n){
		int numSorted = 1; // number of values in place
		int index; // general index
		while (numSorted <  n){
			// take the first unsorted value
			T temp = data[numSorted];
			// ...and insert it among the sorted:
			for (index = numSorted; index > 0; index--){
				if (((Cliente) temp).getEntrada() < ((Cliente) data[index-1]).getEntrada()){
					data[index] = data[index-1];
				} else {
					break;
				}
			}
			// reinsert value
			data[index] = temp;
			numSorted++;
		}
		return (T[]) data;
	}
	
	

	
	

	
}
